package cn.ilovese.collect.util;

import cn.ilovese.collect.po.recommend.RecommendRule;
import cn.ilovese.collect.po.task.Task;
import cn.ilovese.collect.po.user.User;

import java.util.ArrayList;
import java.util.List;

public class RecommendUtil {
    public static Double calculateMatchity(List<Double> vector1,List<Double> vector2){
        Double resNum;
        Double up=0.0;
        Double down=0.0;
        for(int i=0;i<vector1.size();i++){
            up=up+vector1.get(i)*vector2.get(i);
        }
        Double lengthOfV1=0.0;
        Double lengthOfV2=0.0;
        for(int i=0;i<vector1.size();i++){
            lengthOfV1=lengthOfV1+vector1.get(i)*vector1.get(i);
            lengthOfV2=lengthOfV2+vector2.get(i)*vector2.get(i);
        }
        down=Math.sqrt(lengthOfV1)*Math.sqrt(lengthOfV2);
        resNum=up/down;
        return resNum;
    }

    public static List<Double> initTaskVector(Task task){
        List<Double> res=new ArrayList<>();
        switch (task.getType()){
            case "function_test":
                res.add(1.0);
                res.add(0.0);
                res.add(0.0);
                break;
            case "performance_test":
                res.add(0.0);
                res.add(1.0);
                res.add(0.0);
                break;
            case "bug_explore":
                res.add(0.0);
                res.add(0.0);
                res.add(1.0);
                break;
            default:
                res.add(0.0);
                res.add(0.0);
                res.add(0.0);
                break;
        }
        switch (task.getEnvironment()){
            case "iOS12.x":
            case "iOS13.x":
            case "iOS14.x":
            case "iOS15.x":
                res.add(1.0);
                res.add(0.0);
                res.add(0.0);
                break;
            case "Android12":
            case "Android11":
            case "Android10":
            case "Android9":
            case "Android8":
                res.add(0.0);
                res.add(1.0);
                res.add(0.0);
                break;
            case "HarmonyOS1.x":
            case "HarmonyOS2.x":
                res.add(0.0);
                res.add(0.0);
                res.add(1.0);
                break;
            default:
                res.add(0.0);
                res.add(0.0);
                res.add(0.0);
                break;
        }
        return res;
    }

    public static List<Double> initUserVector(RecommendRule recommendRule, User user){
        List<Double> res=new ArrayList<>();
        switch (user.getSkill()){
            case "function_test":
                res.add(recommendRule.getSkillFactor());
                res.add(0.0);
                res.add(0.0);
                break;
            case "performance_test":
                res.add(0.0);
                res.add(recommendRule.getSkillFactor());
                res.add(0.0);
                break;
            case "usecase_design":
            case "exception_locate":
                res.add(0.0);
                res.add(0.0);
                res.add(recommendRule.getSkillFactor());
                break;
            default:
                res.add(0.0);
                res.add(0.0);
                res.add(0.0);
                break;
        }
        switch (user.getTaskPrefer()){
            case "function_test":
                res.set(0,res.get(0)+recommendRule.getTaskPreferFactor());
                break;
            case "performance_test":
                res.set(1,res.get(1)+recommendRule.getTaskPreferFactor());
                break;
            case "bug_explore":
                res.set(2,res.get(2)+recommendRule.getTaskPreferFactor());
                break;
            default:
                break;
        }
        switch (user.getFreqDevice()){
            case "iOS12.x":
            case "iOS13.x":
            case "iOS14.x":
            case "iOS15.x":
                res.add(recommendRule.getTestEnvFactor());
                res.add(0.0);
                res.add(0.0);
                break;
            case "Android12":
            case "Android11":
            case "Android10":
            case "Android9":
            case "Android8":
                res.add(0.0);
                res.add(recommendRule.getTestEnvFactor());
                res.add(0.0);
                break;
            case "HarmonyOS1.x":
            case "HarmonyOS2.x":
                res.add(0.0);
                res.add(0.0);
                res.add(recommendRule.getTestEnvFactor());
                break;
            default:
                res.add(0.0);
                res.add(0.0);
                res.add(0.0);
                break;
        }
        return res;
    }
    public static List<Double> addVector(List<Double> vector1,List<Double> vector2){
        List<Double> res=new ArrayList<>();
        for(int i=0;i<vector1.size();i++){
            res.add(vector1.get(i)+vector2.get(i));
        }
        return res;
    }
}
